'''

动态规划一般分为一维、二维、多维（使用状态压缩），对应形式为 dp(i)dp(i)、dp(i)(j)dp(i)(j)、二进制dp(i)(j)二进制dp(i)(j)。

1. 动态规划做题步骤

明确 dp(i)dp(i) 应该表示什么（二维情况：dp(i)(j)dp(i)(j)）；
根据 dp(i)dp(i) 和 dp(i-1)dp(i−1) 的关系得出状态转移方程；
确定初始条件，如 dp(0)dp(0)。
2. 本题思路

其实方法一的思路不是凭空想象的，而是由动态规划的思想演变而来。这里介绍一维动态规划思想。

dp[i]dp[i] 表示前 ii 天的最大利润，因为我们始终要使利润最大化，则：
dp[i] = max(dp[i-1], prices[i]-minprice)
dp[i]=max(dp[i−1],prices[i]−minprice)
'''
class Solution:
    def maxProfit(self, prices):
        n = len(prices)
        if n == 0: return 0 # 边界条件
        dp = [0] * n
        minprice = prices[0]

        for i in range(1, n):
            minprice = min(minprice, prices[i])
            dp[i] = max(dp[i - 1], prices[i] - minprice)

        return dp[-1]
dp = [0 for _ in range(10)]
dp2 = [0]*10
print(dp2)

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        if n < 2: return 0
        # dp = [0 for _ in range(n)]
        # 初始化第一天的价格就是当前的最低价格
        minPay = prices[0]
        maxGain = 0
        for i in range(n):
            minPay = min(minPay,prices[i])
            maxGain = max(maxGain, prices[i] - minPay)
        return maxGain
'''
给定一个数组，它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易（即买入和卖出一支股票一次），设计一个算法来计算你所能获取的最大利润。

只能一次的话记录一下minPay和maxGain，当前值比之前的买入小的话就更新买入，但是获利的最大值要和原来的比较才可以
'''
class Solution:
    def maxProfit(self, prices):
        n = len(prices)
        if n < 2: return 0
        dp = [0 for _ in range(n)]
        # 初始化第一天的价格就是当前的最低价格
        minPay = prices[0]
        for i in range(n):
            minPay = min(minPay,prices[i])
            dp[i] = max(dp[i-1], prices[i] - minPay)
        return dp[-1]